home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / ASM / B-DISK.ASM < prev    next >
Assembly Source File  |  2000-09-26  |  9KB  |  618 lines

  1. code   segment
  2.  
  3.  assume cs:code,ds:code,es:code,ss:code
  4.  
  5.  org 0
  6.  
  7.  
  8. laufwerke  equ 6
  9.  
  10. ger_num   equ 1
  11. befehl    equ 2
  12. status    equ 3
  13. anz_ger   equ 13
  14. wechsel   equ 14
  15. end_adr   equ 14
  16. p_adr     equ 14
  17. anz_bef   equ 16
  18. anzahl    equ 12h
  19. bpb_adr   equ 12h
  20. v_adr     equ 0fh
  21. sektor    equ 26
  22. ger_bez   equ 22
  23.  
  24. buf_seg   equ 22   ; DualPortedRAM->BufferRAM.PCOffset
  25.  
  26. bpb_sektoren equ 08h
  27. bpb_tracks   equ 0dh
  28. bpb_heads    equ 0fh
  29. bpb_secfat   equ 0bh
  30. bpb_secclu   equ 02h
  31.  
  32. cmd       equ 16384
  33. arg1      equ cmd+00
  34. arg2      equ cmd+02
  35. arg3      equ cmd+04
  36. arg4      equ cmd+06
  37. arg5      equ cmd+08
  38. arg6      equ cmd+0A
  39.  
  40. arg6low   equ arg6+1
  41.  
  42. erst_b    equ this byte
  43.  
  44.  dw -1,-1
  45.  dw 0100100000000000b
  46.  dw offset strat
  47.  dw offset intr
  48.  db laufwerke
  49.  db 7 dup (0)
  50.  
  51. fkt_tab:
  52.  dw offset init
  53.  dw offset med_test
  54.  dw offset get_bpb
  55.  dw offset lesen
  56.  dw offset lesen
  57.  dw offset dummy
  58.  dw offset dummy
  59.  dw offset dummy
  60.  dw offset schreiben
  61.  dw offset schreiben
  62.  dw offset dummy
  63.  dw offset dummy
  64.  dw offset schreiben
  65.  dw offset dummy
  66.  dw offset dummy
  67.  dw offset wechselbar
  68.  dw offset schreiben
  69.  
  70. db_ptr     dw (?),(?)
  71.  
  72. bpb_ptr:
  73.       dw offset bpb1
  74.       dw offset bpb2
  75.       dw offset bpb3
  76.       dw offset bpb4  
  77.       dw offset bpb5
  78.       dw offset bpb6
  79. janus_seg  dw (?)    
  80. janus_ofs  dw (?)
  81.  
  82. bpb1:
  83.  dw 512
  84.  db 1
  85.  dw 1
  86.  db 1
  87.  dw 112
  88.  dw 1760
  89.  db 0FBh
  90.  dw 6
  91.  dw 11
  92.  dw 2
  93.  db 1,0,0,0
  94.  
  95. bpb2:
  96.  dw 512
  97.  db 1
  98.  dw 1
  99.  db 1
  100.  dw 112
  101.  dw 1760
  102.  db 0FBh
  103.  dw 6
  104.  dw 11
  105.  dw 2
  106.  db 1,0,0,0
  107.  
  108. bpb3:
  109.  dw 512
  110.  db 2
  111.  dw 1
  112.  db 2
  113.  dw 112
  114.  dw 1440
  115.  db 0F9h
  116.  dw 3
  117.  dw 9
  118.  dw 2
  119.  db 1,0,0,0
  120.  
  121. bpb4:
  122.  dw 512
  123.  db 2
  124.  dw 1
  125.  db 2
  126.  dw 112
  127.  dw 1440
  128.  db 0F9h
  129.  dw 3
  130.  dw 9
  131.  dw 2
  132.  db 1,0,0,0
  133.  
  134. bpb5:
  135.  dw 512
  136.  db 1
  137.  dw 1
  138.  db 1
  139.  dw 112
  140.  dw 1760
  141.  db 0FBh
  142.  dw 6
  143.  dw 11
  144.  dw 2
  145.  db 1,0,0,0
  146.  
  147. bpb6:
  148.  dw 512
  149.  db 1
  150.  dw 1
  151.  db 1
  152.  dw 112
  153.  dw 1760
  154.  db 0FBh
  155.  dw 6
  156.  dw 11
  157.  dw 2
  158.  db 1,0,0,0
  159.  
  160. vol_name:
  161.  db "DISKTRANS",0,0,0
  162.  
  163.  
  164. strat  proc far
  165.  mov cs:db_ptr,bx
  166.  mov cs:db_ptr+2,es
  167.  ret
  168. strat  endp
  169.  
  170.  
  171. intr   proc far
  172.  pusha
  173.  push es
  174.  push ds
  175.  pushf
  176.  
  177.  push cs
  178.  pop ds
  179.  
  180.  les di,dword ptr db_ptr
  181.  mov bl,es:b[di+befehl]
  182.  cmp bl,anz_bef
  183.  jle bc_okay
  184.  mov ax,8003h
  185.  jmp short intr_end
  186.  
  187. bc_okay:
  188.  shl bl,1
  189.  xor bh,bh
  190.  call [fkt_tab+bx]
  191.  
  192. intr_end  label near
  193.  push cs
  194.  pop ds
  195.  
  196.  les di,dword ptr db_ptr
  197.  or ax,0100h
  198.  mov es:[di+status],ax
  199.  
  200.  popf
  201.  pop ds
  202.  pop es
  203.  popa
  204.  ret
  205. intr  endp
  206.  
  207.  
  208. dummy   proc near
  209.  xor ax,ax
  210.  ret
  211. dummy   endp
  212.  
  213.  
  214. med_test  proc near
  215.  call near select_device
  216.  cmp ax,0
  217.  jne med_test_fehler
  218.  
  219.  push ds
  220.  mov ds,cs:janus_seg
  221.  mov si,cs:janus_ofs
  222.  mov ds:w[si+arg1],4
  223.  call near call_and_wait
  224.  mov ax,ds:w[si+arg2]
  225.  pop ds
  226.  
  227.  mov es:b[di+wechsel],al
  228.  mov ax,offset vol_name
  229.  mov es:w[di+v_adr],ax
  230.  mov es:w[di+v_adr+2],ds 
  231.  xor ax,ax
  232.  
  233. med_test_fehler:
  234.  ret
  235. med_test  endp
  236.  
  237.  
  238. get_bpb  proc near
  239.  call near select_device
  240.  cmp ax,0
  241.  je yyyy
  242.  
  243.  jmp near get_bpb_fehler
  244.  
  245. yyyy:
  246.  push ds
  247.  mov ds,cs:janus_seg
  248.  mov si,cs:janus_ofs
  249.  mov ds:w[si+arg1],4
  250.  call near call_and_wait
  251.  mov ax,ds:w[si+arg2]
  252.  pop ds
  253.  cmp al,0ff
  254.  jne xxxx
  255.  
  256.  jmp near get_bpb_fehler
  257.  
  258. xxxx:
  259.  
  260.  mov si,offset bpb_ptr
  261.  mov bl,es:b[di+ger_num] 
  262.  xor bh,bh
  263.  shl bx,1
  264.  add si,bx
  265.  mov si,cs:w[si]
  266.  mov word ptr es:[di+bpb_adr],si
  267.  mov word ptr es:[di+bpb_adr+2],ds
  268.  
  269.  xor ax,ax
  270. get_bpb_fehler:
  271.  ret
  272. get_bpb  endp
  273.  
  274.  
  275. wechselbar  proc near
  276.  xor ax,ax
  277.  ret
  278. wechselbar  endp
  279.  
  280.  
  281. schreiben  proc near
  282.  push di
  283.  push es
  284.  push ds
  285.  
  286.  call near select_device
  287.  cmp ax,0
  288.  je schreiben_device_okay
  289.  jmp near schreiben_fehler
  290.  
  291. schreiben_device_okay:
  292.  mov bx,es:w[di+anzahl]
  293.  mov dx,es:w[di+sektor]
  294.  lds si,es:[di+p_adr]
  295. schreiben_schleife:
  296.  cmp bx,0
  297.  je schreiben_okay
  298.  
  299.  mov bp,bx
  300.  cmp bp,32
  301.  jle schreiben_2
  302.  mov bp,32
  303.  
  304. schreiben_2:
  305.  push ds
  306.  push si
  307.  push es
  308.  push di
  309.  
  310.  mov es,cs:janus_seg
  311.  mov di,cs:janus_ofs
  312.  mov cx,bp
  313.  shl cx,9
  314.  rep movsb
  315.  
  316.  mov es,cs:janus_seg
  317.  mov di,cs:janus_ofs
  318.  mov es:w[di+arg1],1
  319.  mov es:w[di+arg2],bp
  320.  mov es:w[di+arg3],dx
  321.  call near call_and_wait
  322.  mov cx,es:w[di+arg2]
  323.  
  324.  pop di
  325.  pop es
  326.  pop si
  327.  pop ds
  328.  
  329.  cmp cx,0
  330.  je schreiben_3
  331.  mov ax,cx
  332.  jmp schreiben_fehler 
  333.  
  334. schreiben_3:
  335.  sub bx,bp
  336.  add dx,bp
  337.  mov cx,bp
  338.  shl cx,9
  339.  add si,cx
  340.  jmp schreiben_schleife
  341.  
  342. schreiben_okay:
  343.  call near motor
  344.  cmp cx,0
  345.  jne schreiben_4
  346.  xor ax,ax
  347.  jmp schreiben_fehler
  348.  
  349. schreiben_4:
  350.  mov ax,cx
  351.  
  352. schreiben_fehler:
  353.  pop ds
  354.  pop es
  355.  pop di
  356.  cmp ax,0
  357.  je schreiben_ende
  358.  mov es:w[di+anzahl],0
  359. schreiben_ende:
  360.  ret
  361. schreiben  endp
  362.  
  363.  
  364. lesen  proc near
  365.  push di
  366.  push es
  367.  push ds
  368.  
  369.  call near select_device
  370.  cmp ax,0
  371.  je lesen_device_okay
  372.  jmp near lesen_fehler
  373.  
  374. lesen_device_okay:
  375.  mov bx,es:[di+anzahl]
  376.  mov dx,es:[di+sektor]
  377.  les di,es:[di+p_adr]
  378.  
  379. lese_schleife:
  380.  cmp bx,0
  381.  je lesen_okay
  382.  mov bp,bx
  383.  cmp bp,32
  384.  jle lesen_2
  385.  mov bp,32
  386.  
  387. lesen_2:
  388.  push ds
  389.  push si
  390.  
  391.  mov ds,cs:janus_seg
  392.  mov si,cs:janus_ofs
  393.  mov ds:w[si+arg1],2
  394.  mov ds:w[si+arg2],bp
  395.  mov ds:w[si+arg3],dx
  396.  call near call_and_wait
  397.  mov cx,ds:w[si+arg2]
  398.  
  399.  pop si
  400.  pop ds
  401.  
  402.  cmp cx,0
  403.  je lesen_3
  404.  mov ax,cx
  405.  jmp lesen_fehler 
  406.  
  407. lesen_3:
  408.  push ds
  409.  push di
  410.  mov ds,cs:janus_seg
  411.  mov si,cs:janus_ofs
  412.  mov cx,bp
  413.  shl cx,9
  414.  rep movsb
  415.  pop di
  416.  pop ds
  417.  
  418.  sub bx,bp
  419.  add dx,bp
  420.  mov cx,bp
  421.  shl cx,9
  422.  add di,cx
  423.  jmp lese_schleife
  424. lesen_okay:
  425.  call near motor
  426.  cmp cx,0
  427.  jne lesen_4
  428.  xor ax,ax
  429.  jmp lesen_fehler
  430.  
  431. lesen_4:
  432.  mov ax,cx
  433.  
  434. lesen_fehler:
  435.  pop ds
  436.  pop es
  437.  pop di
  438.  cmp ax,0
  439.  je lesen_ende
  440.  mov es:w[di+anzahl],0
  441. lesen_ende:
  442.  ret
  443. lesen   endp
  444.  
  445.  
  446. motor  proc near
  447.  push es
  448.  push di
  449.  mov es,cs:janus_seg
  450.  mov di,cs:janus_ofs
  451.  mov es:w[di+arg1],3
  452.  call near call_and_wait
  453.  mov cx,es:w[di+arg2]
  454.  pop di
  455.  pop es
  456.  ret
  457. motor  endp
  458.  
  459.  
  460. call_and_wait  proc near
  461.  push ax
  462.  mov ah,7
  463.  mov al,29
  464.  int 0b
  465.  mov ah,8
  466.  mov al,29
  467.  int 0b
  468.  pop ax
  469.  ret
  470. call_and_wait  endp
  471.  
  472.  
  473. select_device  proc near
  474.  push ds
  475.  push es
  476.  push si
  477.  push di 
  478.  mov ds,cs:janus_seg
  479.  mov si,cs:janus_ofs
  480.  mov ds:w[si+arg1],100
  481.  mov bl,es:b[di+ger_num]
  482.  xor bh,bh
  483.  mov ds:w[si+arg2],bx
  484.  call near call_and_wait
  485.  mov ax,ds:w[si+arg2]
  486.  pop di
  487.  pop si
  488.  pop es
  489.  pop ds
  490.  ret
  491. select_device  endp
  492.  
  493.  
  494. treiber_ende  equ this byte
  495. ; ------------------ Ende des Treibers --------------------
  496.  
  497.  
  498. init   proc near
  499.  mov ah,30h
  500.  int 21h
  501.  cmp al,3
  502.  jb prinm
  503.  
  504.  mov cs:w[fkt_tab+00],offset dummy
  505.  
  506.  mov al,es:[di+ger_bez]
  507.  add al,"A"
  508.  mov ger_s,al
  509.  add al,laufwerke-1
  510.  mov ger_e,al 
  511.  
  512. prinm:
  513.  mov dx,offset initm
  514.  mov ah,9
  515.  int 21h
  516.  
  517.  push es
  518.  push di
  519.  
  520.  mov ah,1
  521.  mov al,29
  522.  int 0b
  523.  mov janus_ofs,di
  524.  mov janus_seg,es:w[buf_seg]
  525.  mov ax,di
  526.  
  527.  pop di
  528.  pop es
  529.  
  530.  cmp ax,-1
  531.  jne init_weiter
  532.  
  533.  mov dx,offset init_fehler_text
  534.  mov ah,9
  535.  int 21h
  536.  
  537.  mov word ptr es:[di+end_adr],offset erst_b
  538.  mov es:[di+end_adr+2],ds
  539.  mov byte ptr es:[di+anz_ger],0
  540.  mov ax,20
  541.  jmp init_ende
  542.  
  543. init_weiter:
  544.  mov word ptr es:[di+end_adr],offset treiber_ende
  545.  mov es:[di+end_adr+2],ds
  546.  mov byte ptr es:[di+anz_ger],laufwerke
  547.  mov word ptr es:[di+bpb_adr],offset bpb_ptr
  548.  mov es:w[di+bpb_adr+2],ds
  549.  
  550.  push es
  551.  push di
  552.  
  553.  mov es,cs:janus_seg
  554.  mov di,cs:janus_ofs
  555.  mov es:w[di+arg1],6
  556.  call near call_and_wait
  557.  
  558.  pop di
  559.  pop es
  560.  
  561.  mov dx,offset init_okay_text
  562.  mov ah,9
  563.  int 21h
  564.  xor ax,ax
  565.  
  566. init_ende:
  567.  ret
  568. init  endp
  569.  
  570.  
  571. exe_start  proc far
  572.  push cs
  573.  pop ds
  574.  
  575.  mov dx,offset exe_text
  576.  mov ah,9
  577.  int 21h
  578.  
  579.  mov ax,4c00
  580.  int 21h
  581. exe_start  endp
  582.  
  583.  
  584. initm:
  585.  db "ATUtilities Disk Transfer  -  Version 2.x 94",13,10
  586.  db "-- Byte Rotator Version --",13,10
  587.  db "Copyright (C) 1993 by Thomas Dreibholz.  All rights reserved.",13,10,"$"
  588.  
  589. init_okay_text:
  590.  db "Treiber wurde erfolgreich fr die Laufwerke "
  591. ger_s db "?"
  592.  db ": bis "
  593. ger_e db "?"
  594.  db ": installiert.",13,10,10,"$"
  595.  
  596. init_fehler_text:
  597.  db "Amiga-Handler an Janus-Interrupt 29 ist nicht aktiv!",13,10
  598.  db "Bitte berprfen Sie die Installation der ATUtilities",13,10
  599.  db "Treiber konnte nicht installiert werden.",13,10,10,"$"
  600.  
  601. exe_text:
  602.  db "ATUtilities Disk Transfer:",13,10
  603.  db "Dieses Programm ist ein Laufwerkstreiber und kann deshalb nicht direkt aufge-",13,10
  604.  db "rufen werden. Um den Treiber zu installieren, muá folgende Zeile in die",13,10
  605.  db "CONFIG.SYS eingefgt werden:",13,10,10
  606.  db "DEVICE=Lw:\Verz\DISK.EXE",13,10,10
  607.  db "Nach dem n„chsten Reset stehen dann die neuen Laufwerke zur Verfgung. Bei",13,10
  608.  db "der Installation durch die CONFIG.SYS muá auf dem Amiga das Programm",13,10
  609.  db "Disk Transfer aktiv sein. Zur Vorbereitung und Formatierung und zum Kopieren",13,10
  610.  db "von Disk Transfer-Speichermedien sollte das Programm PREP.EXE benutzt werden.",13,10
  611.  db "Zur Beschleunigung von Zugriffen sollte in der CONFIG.SYS der Eintrag BUFFERS",13,10
  612.  db "auf 15 bis 20 gesetzt werden, oder ein Cache-Programm genutzt werden.",13,10,10,10
  613.  db "17. 09. 1993  -  Version 2.0  Copyright (C) 1993 by Thomas Dreibholz",13,10,10,"$"
  614.  
  615. code  ends
  616.  end exe_start
  617.  
  618.